#coding:utf-8
import sys
import os
from xml.etree import ElementTree


# 当需要把fail文件过滤出来，重新跑一边时，放开注释 os.remove(f)
#ROOT = os.path.dirname(os.path.abspath(__file__))
ROOT = r"D:\zhangyi\js262\JSComformance_Baseline\JSComformance_Baseline\src\262\test262-web-runner-master\tc39-test262-f8456c6\tc39-test262-f8456c6\test"
Xml_path = r"D:\zhangyi\js262\JSComformance_Baseline\JSComformance_Baseline\src\runner\huawei\testResult.xml"

class Process(object):

	def __init__(self,k=0):
		self.k = k

	def obtain_fail_name(self):
		root = ElementTree.parse(Xml_path) # read xml file
		failname = open('fail_js_name.txt', 'wb')
		lst_node = root.getiterator("testcase")
		for emp in lst_node:
			for child in emp.iter(tag='statu'): #tree是ElementTree对象
				if child.text.strip()=='fail':
					# print "emp.attrib:%s" % emp.attrib
					failname.write(str(emp.attrib))
					failname.write('\r\n')
		failname.close()
		if True:
			self.replace_spaces()

	#文件名添加相应的路径
	def replace_spaces(self):
		f=open('fail_js_name.txt','a+')                 #附加读写方式打开
		fnew=open('fail_file_path.txt','wb')            #将结果存入新的文本中
		for line in f.readlines():                      #对每一行先删除空格，\n等无用的字符，再检查此行是否长度为0
			data=line.strip()[11:-2]
			if len(data)!=0:
				#笨办法
				#data = data.replace('e____', '&&')		# 由于文件夹名称有存在'__',所以这里需要特殊处理一下。
				# data = data.replace('r____', '$$')    # 由于文件夹名称有存在'__',所以这里需要特殊处理一下。
				# data = data.replace('__',os.sep) 		#文件名成包含的'__',替换路径符号'\'
				# data = data.replace('&&','e\__')  	# 还原第一步特殊处理的文件路径
				# data = data.replace('$$', 'r__\\')	# 还原第一步特殊处理的文件路径
				data = data.replace('e____', '&&').replace('r____', '$$').replace('__',os.sep).replace('&&','e\__').replace('$$', 'r__\\')		#文件夹名称有存在'__',所以这里需要特殊处理一下。
				path =('%s'%ROOT+os.sep+data) 			#拼接成文件的绝对路径
				fnew.write(path) 						#写入fail_file_path.txt 文件
				fnew.write('\r\n') 						#回车键换行
				self.k+=1
		print u'fail的js文件总数是：%d'%int(self.k)
		# 关闭文件
		f.close()
		fnew.close()
		if True:
			self.del_pass_file()

	#删除pass的js文件
	def del_pass_file(self):
		with open('fail_file_path.txt', 'r') as fa:
			content = fa.read()
		#取出指定路径文件夹下所有目录以及子目录下的文件
		fns = [os.path.join(root, fn) for root, dirs, files in os.walk(ROOT) for fn in files]
		i = j = 0
		for f in fns:
			if f not in content:
					# os.remove(f)
				j += 1
			i += 1
		print u'js文件总数是：%d'%i
		print u'处理之后保留fail的文件总数是：%d'%((i-j))
		if i-j!=self.k:
			print u'以下 %d 个fail的文件被误删除' %(int(self.k-i+j))
			self.analysis()
		else:
			print u'===================  提取fail成功！======================='

	#对比删除pass之后留下的fail与原文件是否一致。输出对比结果js文件路径
	def analysis(self):
		fe = open('Error_file_path.txt', 'wb')
		fns = [os.path.join(root, fn) for root, dirs, files in os.walk(ROOT) for fn in files]
		for f in fns:
			fe.write(f)
			fe.write('\r\n')
		fe.close()
		f1 = open("Error_file_ path.txt", "r")
		m = f1.read()
		f2 = open("fail_file_path.txt", "r")
		n = f2.readlines()
		for a in n:
			if a not in m:
				print a

if __name__ == "__main__":
	Process().obtain_fail_name()








